package cn.lcsjsxy.yxc.objectoriented.内部类;

/*
* 类的内部成员之五：com.yang_xc.objectoriented.内部类
* 1.Java中允许将一个类A声明在另一个类B中，则类A就是内部类，类B称为外部类
* 2.内部类的分类：成员内部类 Vs 局部内部类（方法内、代码块内、构造器内）
* 3.成员内部类：
*           一方面，作为外部类的成员：
*                       》可以调用外部类的结构
*                       》可以被static修饰
*                       》可以被4种不同的权限修饰
*
*           另一方面：作为一个类：
*                       》类内可以定义属性、方法、构造器
*                       》可以被final修饰，表示此类不能被继承，言外之意，不适用final，就可以被继承
*                       》可以被abstract修饰
* 4.关注如下的3个问题
*   4.1如何实例化成员内部类的对象
*   4.2如何在成员内部类中区分调用外部类的结构
*   4.3开发中局部内部类的使用
* */
public class InnerClass {
    public static void main(String[] args) {
        //创建Dog实例（静态的成员内部类）
        Person.Dog dog=new Person.Dog();

        //创建Bird实例（非静态的成员内部类）
        Person p=new Person();
        Person.Bird bird=p.new Bird();

    }
}

class Person{

    String name;
    int age;

    public void eat(){
        System.out.println("人吃吃吃吃吃");
    }

    //静态成员内部类
    static class Dog{
        String name;
        int age;
        public void show(){
            System.out.println("卡拉是条狗");
        }
    }

    //非静态成员内部类
    class Bird{
        public void Sing(){
            System.out.println("我是一只小小鸟~~");
            eat();  //调用外部类的属性（非静态）
        }
    }



    public void method(){

        //类中局部内部类
        class AA{

        }
    }

    //代码块内局部内部类
    {
        class BB{

        }
    }

    public Person() {
        //构造器中局部内部类
        class CC{

        }
    }
}